package com.appkubes.mall.admin.application.system.config.service.impl;

import com.appkubes.mall.admin.application.system.config.dao.ConfigGlobalDao;
import com.appkubes.mall.admin.application.system.config.entity.dto.ConfigDTO;
import com.appkubes.mall.admin.application.system.config.service.ConfigGlobalService;
import com.appkubes.mall.admin.application.system.config.service.ConfigService;
import com.appkubes.mall.core.po.MallSystemConfigGlobal;
import com.appkubes.mall.core.po.MallSystemConfigGlobalExample;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: Rongjie
 * @Date: 2020/1/18 21:56
 * @Description:
 */
@Service
public class ConfigGlobalServiceImpl implements ConfigGlobalService {

    @Resource
    ConfigGlobalDao configGlobalDao;

    @Resource
    ConfigService configService;

    List<ConfigDTO> getRootNode(String systemCode, int lev) {
        MallSystemConfigGlobalExample example = new MallSystemConfigGlobalExample();
        example.createCriteria().andSystemCodeEqualTo(systemCode).andConfigLevelEqualTo(lev);
        List<MallSystemConfigGlobal> mallSystemConfigGlobals = configGlobalDao.selectByExample(example);
        return cast2DTOS(mallSystemConfigGlobals);
    }

    List<ConfigDTO> getLeafNode(String appKey, String typeCode, int lev) {
        MallSystemConfigGlobalExample example = new MallSystemConfigGlobalExample();
        example.createCriteria().andConfigTypeCodeEqualTo(typeCode).andConfigLevelEqualTo(lev);

        List<MallSystemConfigGlobal> mallSystemConfigGlobals = configGlobalDao.selectByExample(example);
        List<ConfigDTO> configDTOS = new ArrayList<>();
        for (MallSystemConfigGlobal mallSystemConfigGlobal : mallSystemConfigGlobals) {
            ConfigDTO configDTO = new ConfigDTO();
            BeanUtils.copyProperties(mallSystemConfigGlobal, configDTO);

            String platValue = configService.getConfigValue(mallSystemConfigGlobal.getGlobalConfigKey());
            if (platValue != null) {
                configDTO.setConfigValue(platValue);
            }
            configDTOS.add(configDTO);
        }
        return configDTOS;
    }

    private List<ConfigDTO> cast2DTOS(List<MallSystemConfigGlobal> mallSystemConfigGlobals) {
        List<ConfigDTO> configDTOS = new ArrayList<>();
        for (MallSystemConfigGlobal mallSystemConfigGlobal : mallSystemConfigGlobals) {
            ConfigDTO configDTO = new ConfigDTO();
            BeanUtils.copyProperties(mallSystemConfigGlobal, configDTO);
            configDTOS.add(configDTO);
        }
        return configDTOS;
    }

    @Override
    public ConfigDTO getConfigGlobal(String systemCode) {
        List<ConfigDTO> rootNode = getRootNode(systemCode, 0);
        if (rootNode.size() == 0) return null;
        ConfigDTO configDTO = rootNode.get(0);

        configDTO.setConfigDTOS(getRootNode(systemCode, 1));
        return configDTO;
    }

    @Override
    public List<ConfigDTO> getLeafConfigGlobal(String appKey, String typeCode) {
        List<ConfigDTO> leafNode = getLeafNode(appKey, typeCode, 2);
        return leafNode;
    }
}
